home *** CD-ROM | disk | FTP | other *** search
/ Qu.......ke Neue Level / KroGer Software GmbH - Qu_ke.iso / UTILITY / PRG8.ZIP / REWAD2.C < prev    next >
C/C++ Source or Header  |  1996-03-01  |  4KB  |  127 lines

  1. /*
  2.  * Rewad2.c - Uses the routines in the QEU library to re-create a
  3.  *            Quake WAD2 file from a list of separate files.
  4.  *
  5.  * Do whatever you want with this file, but don't blame me if
  6.  * something doesn't work.  If you manage to destroy your hard disk
  7.  * with it, that's too bad for you...  Use it at your own risks!
  8.  */
  9.  
  10. #include "qeu.h"
  11. #include "q_misc.h"
  12. #include "q_files.h"
  13. #include "f_bitmap.h"
  14. #include "f_wad2.h"
  15.  
  16.  
  17. void main(int argc, char *argv[])
  18. {
  19.   char       *filename;
  20.   FILE       *file;
  21.   FILE       *srcfile;
  22.   int         ftype;
  23.   WAD2DirPtr  dir;
  24.   UInt16      dirsize;
  25.   char       *indexname = NULL;
  26.   Bool        convert = FALSE;
  27.   UInt32      size, count;
  28.   char       *entryname;
  29.   UInt8       type;
  30.  
  31.   /* read the parameters... */
  32.   for (argv++, argc--; argc && **argv == '-'; argv++, argc--)
  33.     if ((*argv)[1] == 'h')
  34.       {
  35.     fprintf(stderr, "REWAD2 %s by Raphael Quinet\n\n", QEU_VERSION);
  36.     fprintf(stderr, "Usage: rewad2 [-h] [-c] [-i <indexfile>] file.wad [entryname...]\n");
  37.     fprintf(stderr, "       -h  -- display this help screen\n");
  38.         fprintf(stderr, "       -c  -- convert BMP files to bitmaps\n");
  39.     fprintf(stderr, "       -i  -- get the list of files from the specified index file\n");
  40.     fprintf(stderr, "Rewad2 will create a WAD2 file containing all the files specified on the\n");
  41.     fprintf(stderr, "command line, or append them to the WAD2 file if it already exists\n");
  42.     fprintf(stderr, "If the -i option is used, the list of files is read from the specified\n");
  43.     fprintf(stderr, "index file (usually %s, as created by unwad2).\n", QEU_INDEX_FILE);
  44.     exit(1);
  45.       }
  46.     else if ((*argv)[1] == 'c')
  47.       convert = TRUE;
  48.     else if ((*argv)[1] == 'i' && argc-- > 1)
  49.       indexname = *++argv;
  50.     else
  51.       ProgError("Invalid argument (%s).  Use rewad2 -h for help.", *argv);
  52.   if (argc <= 0)
  53.     ProgError("Missing argument.  Use rewad2 -h for help.");
  54.   filename = *argv;
  55.   if (indexname == NULL && argc < 2)
  56.     ProgError("List of files missing.  Use rewad2 -h for help.");
  57.  
  58.   if (convert == TRUE)
  59.     ProgWarning("Option -c not implemented yet.  Ignored.\n"); /*! ... */
  60.  
  61.   /* check if the file exists */
  62.   file = OpenFileReadMagic(filename, &ftype);
  63.   if (file == NULL)
  64.     {
  65.       /* create a new WAD2 file */
  66.       file = fopen(filename, "wb");
  67.       if (file == NULL)
  68.     ProgError("Cannot create file (%s)", filename);
  69.       if (WriteWAD2Header(file, &count, &dir, &dirsize) == FALSE)
  70.     ProgError("Cannot write WAD2 file header");
  71.     }
  72.   else
  73.     {
  74.       /* append to an existing WAD2 file */
  75.       if (ftype != FTYPE_WAD2)
  76.     ProgError("File is not a WAD2 file (%s)", filename);
  77.       dir = ReadWAD2Directory(file, 0L, &dirsize);
  78.       if (dir == NULL)
  79.     ProgError("Cannot read main directory from %s", filename);
  80.       /* re-open file for writing */
  81.       fclose(file);
  82.       file = fopen(filename, "r+b");
  83.       count = dir[dirsize - 1].offset + dir[dirsize - 1].size;
  84.       if (file == NULL || fseek(file, count, SEEK_SET) < 0)
  85.     ProgError("Cannot re-open file for writing (%s)", filename);
  86.     }
  87.  
  88.   /* parse the index file and read all the files listed in it */
  89.   if (indexname != NULL)
  90.     ProgError("Option -i not implemented yet.  Sorry...\n"); /*! missing */
  91.  
  92.   /* if there are extra arguments on the command line, read these files too */
  93.   for (argv++, argc--; argc; argv++, argc--)
  94.     {
  95.       entryname = QStrNDupHack(*argv, 16);
  96.       /* hack for guessing the type of the entry... */
  97.       if (!strnicmp(entryname, "PALETTE", 7))
  98.     type = '@';
  99.       else if (!strnicmp(entryname, "CONBACK", 7)
  100.            || !strnicmp(entryname, "CONCHARS", 8))
  101.     type = 'E';
  102.       else
  103.     type = 'B';
  104.       srcfile = fopen(*argv, "rb");
  105.       if (srcfile == NULL)
  106.     ProgError("File not found (%s)", *argv);
  107.       size = GetFileSize(srcfile);
  108.       printf("Copying %lu bytes from %s\n", size, *argv);
  109.       if (CopyBytes(file, srcfile, size) == FALSE)
  110.     ProgError("Cannot copy data");
  111.       if (AddWAD2Entry(file, &count, &dir, &dirsize, entryname, size, type) == FALSE)
  112.     ProgError("Cannot register entry in WAD2 directory (%s)", entryname);
  113.       fclose(srcfile);
  114.       QFree(entryname);
  115.     }
  116.  
  117.   /* write the directory */
  118.   size = WriteWAD2Directory(file, &count, dir, dirsize);
  119.   if (size == 0L)
  120.     ProgError("Cannot write WAD2 directory");
  121.   printf("Total size of %s: %lu bytes\n", filename, size);
  122.  
  123.   /* close the file and say goodbye */
  124.   fclose(file);
  125.   exit(0);
  126. }
  127.